package jedis;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.SortingParams;

// https://www.jb51.net/article/69131.htm
// https://www.cnblogs.com/linjiqin/archive/2013/06/14/3135921.html
public class SortTest {

    public static void main(String[] args) {
        SortTest sortTest = new SortTest();

//        sortTest.sort();
//        sortTest.sortGet();
        sortTest.sortBy();

    }

    /**
     * 排序为生成一个新的key，不改变排序的key
     */
    public void sort() {
//        Jedis jedis = new Jedis("127.0.0.1", 6379);
        Jedis jedis = JedisUtil.getJedis();

        jedis.flushDB();
        jedis.lpush("myList", "a3");
        jedis.lpush("myList", "a2");
        jedis.lpush("myList", "a1");

        SortingParams sortingParams = new SortingParams();
        sortingParams.alpha(); // 字符串类型排序需要添加按照字典排序这个函数
        sortingParams.desc();

        // 排序前：[a1, a2, a3]
        System.out.println(jedis.lrange("myList", 0, -1));
        // 排序结果：[a3, a2, a1]
        System.out.println(jedis.sort("myList", sortingParams));
        // 排序后：[a1, a2, a3]
        System.out.println(jedis.lrange("myList", 0, -1));

        jedis.close();
    }

    /**
     * 排序为生成一个新的key，不改变排序的key
     */
    public void sortGet() {
//        Jedis jedis = new Jedis("127.0.0.1", 6379);
        Jedis jedis = JedisUtil.getJedis();

        jedis.flushDB();
        jedis.lpush("myList", "a1");
        jedis.lpush("myList", "a2");
        jedis.lpush("myList", "a3");

        jedis.set("key:a1", "b1");
        jedis.set("key:a3", "b3");
        jedis.set("key:a4", "b4");

        SortingParams sortingParams = new SortingParams();
        sortingParams.alpha(); // 字符串类型排序需要添加按照字典排序这个函数
        sortingParams.desc();
        sortingParams.get("key:*");

        // 等效为 sort myList get key:* alpha desc
        // key myList进行降序排序排序，排序结果为 [a3, a2, a1]
        // 将get的key：*的*进行替换得到 [key：a3, key:a2, key:a1]
        // 获得[key：a3, key:a2, key:a1]对应的value [b3, null, b1]
        System.out.println(jedis.sort("myList", sortingParams)); //[b3, null, b1]

        SortingParams sortingParams2 = new SortingParams();
        sortingParams2.alpha(); // 字符串类型排序需要添加按照字典排序这个函数
        sortingParams2.desc();
        sortingParams2.get("key:*", "#"); //用#获取被排序键的值(这里sort的对像为myList)
        System.out.println(jedis.sort("myList", sortingParams2)); //[b3, a3, null, a2, b1, a1]

        jedis.close();
    }

    /**
     * 排序为生成一个新的key，不改变排序的key
     */
    public void sortBy() {
//        Jedis jedis = new Jedis("127.0.0.1", 6379);
        Jedis jedis = JedisUtil.getJedis();

        jedis.flushDB();
        jedis.lpush("uid", "u1");
        jedis.lpush("uid", "u2");
        jedis.lpush("uid", "u3");
        jedis.lpush("uid", "u5");

        jedis.set("uid:u1", "aa1");
        jedis.set("uid:u3", "aa3");
        jedis.set("uid:u4", "aa4");

        SortingParams sortingParams = new SortingParams();
        sortingParams.alpha(); // 字符串类型排序需要添加按照字典排序这个函数
        sortingParams.desc();
        sortingParams.by("uid:*");

        // 等效为 sort uid by uid:* alpha desc
        // 取出uid的的值[u1, u2, u3, u5], 替换uid:*的* [uid:u1, uid:u2, uid:u3, uid:u5]
        // 获得[uid:u1, uid:u2, uid:u3, uid:u5]对应的value值[aa1, null, aa3, null]
        // 对取出的value值进行排序[aa1, null, aa3, null]对应的value为降序排序大小为aa3 > aa1 > null> null,
        // 将其作为顺序对uid进行排序，uid排序结果为[u3, u1, u2, u5]
        System.out.println(jedis.sort("uid", sortingParams)); //[u3, u1, u2, u5]

        jedis.close();
    }

}
